// 产品模型定义文件
// 该文件定义了产品数据表的结构和相关配置

const Sequelize = require('sequelize');

/**
 * 定义产品模型
 * @param {Sequelize} sequelize - Sequelize实例
 * @param {DataTypes} DataTypes - Sequelize数据类型
 * @returns {Model} 产品模型
 */
module.exports = function (sequelize, DataTypes) {
  return sequelize.define('products', {
    // 产品ID字段 - 主键，自增
    product_id: {
      autoIncrement: true,              // 设置为自增字段
      autoIncrementIdentity: true,      // PostgreSQL的自增标识
      type: DataTypes.INTEGER,          // 数据类型为整数
      allowNull: false,                 // 不允许为空
      primaryKey: true                  // 设置为主键
    },

    // 产品编码字段
    product_code: {
      type: DataTypes.STRING(50),       // 数据类型为字符串，最大长度50
      allowNull: false,                 // 不允许为空
      unique: true                      // 设置为唯一约束
    },

    // 产品名称字段
    product_name: {
      type: DataTypes.STRING(100),      // 数据类型为字符串，最大长度100
      allowNull: false,                 // 不允许为空
      unique: "products_product_name_key" // 设置为唯一约束
    },

    // 成本价字段
    cost_price: {
      type: DataTypes.DECIMAL,          // 数据类型为十进制定点数
      allowNull: true                   // 允许为空
    },

    // 零售价字段
    retail_price: {
      type: DataTypes.DECIMAL,          // 数据类型为十进制定点数
      allowNull: true                   // 允许为空
    },

    // 批发价字段
    wholesale_price: {
      type: DataTypes.DECIMAL,          // 数据类型为十进制定点数
      allowNull: true                   // 允许为空
    },

    // 产品分类ID字段
    category_id: {
      type: DataTypes.INTEGER,          // 数据类型为整数
      allowNull: true                   // 允许为空
    },
    // 产品规格字段
    specifications: {
      type: DataTypes.TEXT,             // 数据类型为文本，可以存储较长的规格描述
      allowNull: true,                  // 允许为空
      comment: '产品规格描述，如尺寸、重量、颜色等详细信息' // 字段注释
    }
  }, {
    sequelize,                          // Sequelize实例
    tableName: 'products',              // 指定数据表名
    schema: 'public',                   // 指定数据库模式
    hasTrigger: true,                   // 表具有触发器
    timestamps: true,                   // 启用时间戳
    createdAt: 'created_at',            // 指定创建时间字段名
    updatedAt: 'updated_at',            // 指定更新时间字段名
    indexes: [                          // 索引定义
      {
        name: "products_pkey",          // 主键索引
        unique: true,                   // 唯一索引
        fields: [                       // 索引字段
          { name: "product_id" },       // 索引字段为产品ID
        ]
      },
      {
        name: "products_product_name_key", // 产品名称唯一索引
        unique: true,                   // 唯一索引
        fields: [                       // 索引字段
          { name: "product_name" },     // 索引字段为产品名称
        ]
      },
      {
        name: "products_product_code_key", // 产品编码唯一索引
        unique: true,                   // 唯一索引
        fields: [                       // 索引字段
          { name: "product_code" },     // 索引字段为产品编码
        ]
      },
    ]
  });
};